﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;

namespace StarControl
{
    class PlayerScreen : GameScreen
    {
        KeyboardState keyboardState;
        Texture2D image;
        Rectangle imageRectangle;
        Texture2D imageSeta;
        Vector2 posicaoSeta;
        KeyboardState oldKeyboardState;
        Texture2D[] naves;
        Vector2[] posicaoNaves;
        public TipoNave.Tipo[] navesSelecionadas;
        public TipoNave listaNaves = new TipoNave();
        TipoNave.TipoCaracteristicas enemyCarac;
        public int jogadorVez = 0;
        int escolhaNovamente = 0;
        string mensagem;
        Vector2 posMensagem;
        string[] caracteristicas;
        Vector2[] posCaracteristicas;
        
        public PlayerScreen(Game game, SpriteBatch spriteBatch, Texture2D image)
            : base(game, spriteBatch)
        {
            this.image = image;
            imageRectangle = new Rectangle(
            0,
            0,
            Game.Window.ClientBounds.Width,
            Game.Window.ClientBounds.Height);
            imageSeta = Game.Content.Load<Texture2D>("Tela/arrow_up");
            posicaoSeta = new Vector2(110, 350);

            naves = new Texture2D[4];
            naves[0] = Game.Content.Load<Texture2D>("Textures/naves/Millenium");
            naves[1] = Game.Content.Load<Texture2D>("Textures/naves/Pegasus");
            naves[2] = Game.Content.Load<Texture2D>("Textures/naves/Starfight");
            naves[3] = Game.Content.Load<Texture2D>("Textures/naves/Valkyrie");

            posicaoNaves = new Vector2[4];
            posicaoNaves[0] = new Vector2(90, 120);
            posicaoNaves[1] = new Vector2(270, 120);
            posicaoNaves[2] = new Vector2(450, 120);
            posicaoNaves[3] = new Vector2(630, 120);

            navesSelecionadas = new TipoNave.Tipo[2];

            posMensagem = new Vector2(20,400);

            caracteristicas = new string[4];
            caracteristicas[0] = "Defense";
            caracteristicas[1] = "Defense";
            caracteristicas[2] = "Attack";
            caracteristicas[3] = "Attack";

            posCaracteristicas = new Vector2[4];
            posCaracteristicas[0] = new Vector2(90, 200);
            posCaracteristicas[1] = new Vector2(270, 200);
            posCaracteristicas[2] = new Vector2(450, 200);
            posCaracteristicas[3] = new Vector2(630, 200);
        }

        public override void Update(GameTime gameTime)
        {
            base.Update(gameTime);
            keyboardState = Keyboard.GetState();

            if (CheckKey(Keys.Right))
            {
                if(posicaoSeta.X < 650)
                    posicaoSeta += new Vector2(180, 0);
            }
            if (CheckKey(Keys.Left))
            {
                if(posicaoSeta.X > 110)
                    posicaoSeta -= new Vector2(180, 0);
            }

            if (getJogadorVer() > 1)
            {
                mensagem = "Press Enter for battle!";
            }
            else
            {
                if (getJogadorVer() == 0)
                {
                    mensagem = "Player One, choose your ship!";
                }
                else if (getJogadorVer() == 1)
                {
                    if(escolhaNovamente.Equals(0))
                        mensagem = "Player Two, choose your ship!";
                    else if (escolhaNovamente.Equals(1))
                        mensagem = "Player Two, you can not choose a ship with the same feature of Player One!";
                    else if(escolhaNovamente.Equals(2))
                        mensagem = "Player Two, choose another ship!";
                }
                if (CheckKey(Keys.Enter))
                {
                    
                    if (posicaoSeta.X == 110)
                        navesSelecionadas[getJogadorVer()] = TipoNave.Tipo.MileniunShip;
                    if (posicaoSeta.X == 290)
                        navesSelecionadas[getJogadorVer()] = TipoNave.Tipo.Pegasus;
                    if (posicaoSeta.X == 470)
                        navesSelecionadas[getJogadorVer()] = TipoNave.Tipo.Starfigther;
                    if (posicaoSeta.X == 650)
                        navesSelecionadas[getJogadorVer()] = TipoNave.Tipo.Valkyrie;

                    if (getJogadorVer() == 1)
                    {
                        if (navesSelecionadas[getJogadorVer()] == navesSelecionadas[getJogadorVer() - 1])
                        {
                            setJogadorVer(0);
                            escolhaNovamente = 2;
                        }
                        else
                        {
                            foreach (TipoNave tp in listaNaves.getTiposNaves())
                            {
                                if (tp.tipo == navesSelecionadas[getJogadorVer()])
                                {
                                    if (tp.tipoCarac == enemyCarac)
                                    {
                                        escolhaNovamente = 1;
                                        setJogadorVer(0);
                                        break;
                                    }
                                }
                            }
                        }
                    }
                    else if (getJogadorVer() == 0)
                    {
                        foreach (TipoNave tp in listaNaves.getTiposNaves())
                        {
                            //verificar a caracteristica da nave se é ataque ou defesa
                            if (tp.tipo == navesSelecionadas[getJogadorVer()])
                            {
                                enemyCarac = tp.tipoCarac;
                            }
                        }
                    }

                    setJogadorVer(getJogadorVer()+1);
                }
            }

            oldKeyboardState = keyboardState;

            if (keyboardState.IsKeyDown(Keys.Escape))
                game.Exit();
        }

        private bool CheckKey(Keys theKey)
        {
            return keyboardState.IsKeyUp(theKey) &&
                oldKeyboardState.IsKeyDown(theKey);
        }

        public override void Draw(GameTime gameTime)
        {
            spriteBatch.Draw(image, imageRectangle, Color.White);
            if (getJogadorVer() <= 1)
                spriteBatch.Draw(imageSeta, posicaoSeta, Color.White);
            for (int i = 0; i < 4; i++)
            {
                spriteBatch.Draw(naves[i], posicaoNaves[i], Color.White);
                spriteBatch.DrawString(Game.Content.Load<SpriteFont>("Tela/menufont"), caracteristicas[i], posCaracteristicas[i], Color.White);
            }
            spriteBatch.DrawString(Game.Content.Load<SpriteFont>("Tela/menufont"), mensagem, posMensagem, Color.White);
            base.Draw(gameTime);
        }

        public void Limpar()
        {
            setJogadorVer(0);
            this.escolhaNovamente = 0;
            this.navesSelecionadas = new TipoNave.Tipo[2];
            posicaoSeta = new Vector2(110, 350);
            keyboardState = new KeyboardState();
            oldKeyboardState = new KeyboardState();
        }

        public int getJogadorVer()
        {
            return this.jogadorVez;
        }
        public void setJogadorVer(int valor)
        {
            this.jogadorVez = valor;
        }
    }
}
